ggplot2, c’est quoi?

  • Une implementation de Grammar of Graphics de Leland Wilkinson
  • RĂ©digĂ© par Hadley Wickham
  • Un 3ème package de R dĂ©diĂ© aux graphiques (avec base et lattice)
  • Disponible sur le site du CRAN via install.packages()
  • Un site web de rĂ©fĂ©rence: http://ggplot2.tidyverse.org/index.html

Grammar of Graphics

“En bref, la grammaire nous dit qu’un graphique est une cartographie de donnĂ©es Ă  travers des gĂ©omĂ©tries (des points, des lignes, des barres, …) ayant des attributs (la couleur, la forme, la taille, …). Les donnĂ©es du graphique peuvent aussi ĂŞtre transformĂ©es et ainsi ĂŞtre projetĂ©es sur un nouveau système de coordonnĂ©es.”

Traduit de : ggplot2-book de Hadley Wickham: https://github.com/hadley/ggplot2-book http://ggplot2.org/book/

Quelles est la différence avec Base et Lattice

Base

Sur Base un graphique est créé en 2/3 étapes à partir d’un fond blanc: 1. On créé le graphique qui nous interesse 2. On ajoute les annotations

  • Le plus: C’est pratique, on applique directement la fonction que l’on recherche sur les donnĂ©es que l’on veut traiter.
  • Les moins:
    • On ne peut pas revenir en arrière.
    • Ne correspond Ă  aucun autre langage.

Lattice

Sur Lattice, les graphiques sont créé à partir de fonctions uniques (xyplot, bwplot, etc.)

  • Les plus:
    • Il est plus pratique que Base pour visualiser 3 dimensions par exemple: Regarder comment y change avec x Ă  travers les niveaux de z
    • Les ajustements d’espaces ou de marges se font automatiquement.
    • AdaptĂ© pour mettre plusieurs graphiques sur une mĂŞme fenĂŞtre.
  • Les moins:
    • Il peut ĂŞtre compliquĂ© de spĂ©cifier l’ensemble des arguments dans une seule fonction
    • L’ajout d’annotations n’est pas simple.
    • On ne peut pas revenir en arrière.

ggplot2

  • Les plus:
    • Pratique pour visualiser 3 dimensions par exemple: Regarder comment y change avec x Ă  travers les niveaux de z
    • On peut revenir en arrière.
    • On peut personnaliser Ă  volontĂ©
    • Les outils interactifs offre une Ă©volution possible
    • Existence de nombreuses extensions

Comparaison de Base, Lattice et ggplot2 Ă  travers un exemple

Création d’un nuage de points

#Avec Base
plot(diamonds$carat, diamonds$price)

library(lattice)

#Avec Lattice
xyplot(price ~ carat, data = diamonds)

library(ggplot2)

#Avec ggplot2
ggplot(data = diamonds,aes(x=carat,y=price))+
  geom_point()

###Ajout d’annotations au nuage de points

#Avec Base
plot(diamonds$carat, diamonds$price,
     main = "Nuage de points avec le package Base",
      xlab = "Poids des diamants en carats", 
      ylab = "Prix")

#Avec Lattice
xyplot(price ~ carat, data = diamonds,
       main = "Nuage de points avec le package Lattice", 
       xlab = "Poids des diamants en carats", 
       ylab = "Prix")

#Avec ggplot2
ggplot(data = diamonds,aes(x=carat,y=price))+
  geom_point()+
  labs(title = "Nuage de points avec le package ggplot2", 
       x = "Poids des diamants en carats", 
       y = "Prix")

###Changer les formes et la couleur d’un nuage de points

#Avec Base
plot(diamonds$carat, diamonds$price,
     main = "Nuage de points avec le package Lattice", 
     xlab = "Poids des diamants en carats", 
     ylab = "Prix",
     col = "chocolate", 
     cex = 0.8,
     pch = 8)

#Avec Lattice
xyplot(price ~ carat, data = diamonds,
       main = "Nuage de points avec le package Lattice", 
       xlab = "Poids des diamants en carats", 
       ylab = "Prix",
       col = "chocolate", 
       cex = 0.8,
       pch = 8)

#Avec ggplot2
ggplot(data = diamonds,aes(x=carat,y=price))+
  geom_point(color="chocolate",cex = 0.8,pch=8)+
  labs(title = "Nuage de points avec le package ggplot2", 
       x = "Poids des diamants en carats", 
       y = "Prix")

###Réaliser plusieurs nuages de points

#Avec Base
par(mfrow=c(2,3))
for(i in levels(diamonds$cut)){
  data_graphique<-diamonds%>%filter(cut==i)
  plot(data_graphique$carat, data_graphique$price,
       main = "Nuage de points avec le package Lattice", 
       xlab = "Poids des diamants en carats", 
       ylab = "Prix",
       col = "chocolate", 
       cex = 0.8,
       pch = 8)
}

#Avec Lattice
par(mfrow=c(1,1))
xyplot(price ~ carat | cut, data = diamonds,
       main = "Nuage de points avec le package Lattice", 
       xlab = "Poids des diamants en carats", 
       ylab = "Prix",
       col = "chocolate",
       cex = 0.8, 
       pch = 8)

#Avec ggplot2
ggplot(data = diamonds,aes(x=carat,y=price))+
  geom_point(color="chocolate",cex = 0.8,pch=8)+
  labs(title = "Nuage de points avec le package ggplot2", 
       x = "Poids des diamants en carats", 
       y = "Prix")+
  facet_wrap( ~ cut, ncol=3)

###Ajouter des éléments une fois le graphique créé

L’ajout d’éléments sur un graphique déjà crée n’est possible qu’avec ggplot2

#On créé un premier nuage de points
g1<-ggplot(data = diamonds,aes(x=carat,y=price))+
  geom_point(color="chocolate",cex = 0.8,pch=8)+
  labs(title = "Nuage de points avec le package ggplot2", 
       x = "Poids des diamants en carats", 
       y = "Prix")
g1

#On lui a joute dans un second temps la fonction facet
g1+
  facet_wrap( ~ cut, ncol=3)

La fonction qplot() comme quick plot

Pour réaliser des graphique de base, la fonction qplot() du package ggplot2 peut suffire. Cependant les possibilités de personnalisation sont limitées.

qplot(carat, price, data = diamonds)

Si une seule variable est précisée, qplot() réalisera un histogramme.

qplot(carat, data = diamonds)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Changer quelques attributs esthétiques (couleur, taille ou forme)

dsmall <- diamonds[sample(nrow(diamonds), 100), ]
#La couleur
qplot(carat, price, data = dsmall, colour = color)

#la forme
qplot(carat, price, data = dsmall, shape = cut)
## Warning: Using shapes for an ordinal variable is not advised

#la taille
qplot(carat, price, data = dsmall, size = cut)

Produire différents types de graphiques:

qqplot ne se limite pas aux nuages de points et permet de produire toutes sortes de graphiques grâce à l’argument geom. Geom est donc l’abbréviation de geometry. cela décrit la forme sous laquelle nous souhaitons visualiser nos données.

  • geom = “point” dessine un nuage de points. Il s’agit de la gĂ©omĂ©trie par dĂ©faut quand on declare les arguments x et y.
qplot(carat, price, data = dsmall, geom="point")

  • geom = “smooth” pour visualiser les valeurs prĂ©dites d’un modele et l’écart-type
qplot(carat, price, data = dsmall, geom="smooth")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

  • geom = “boxplot”
qplot(cut, price, data = dsmall, geom="boxplot")

  • geom = “path” et geom = “line” pour dessiner des lignes entre les points.
#path
qplot(carat, price, data = dsmall, geom="path")

#line
qplot(carat, price, data = dsmall, geom="line")

Pour l’analyse de variables continues, nous pouvons utiliser les gĂ©omĂ©tries suivantes: * geom = “histogram”

qplot(price, data = dsmall, geom="histogram")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

  • geom =“freqpoly”
qplot(price, data = dsmall, geom="freqpoly")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

  • geom = “density” pour dessiner un graphique de densitĂ©.
qplot(price, data = dsmall, geom="density")

Pour l’analyse de variables discretes, nous pouvons utiliser geom = “bar” qui dessine un diagramme en baton.

qplot(cut, data = dsmall, geom="bar")

Superposer une courbe de tendance sur un nuage de points:

L’ajout de la géométrie smooth permet de visualiser rapidement un tendance qui se dégage.

qplot(carat, price, data = diamonds, geom = c("point", "smooth"))
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

Boxplot et jitter

Les boxplots et jitter sont très utiles pour visualiser la distribution d’une variable continue en fonction de variables discrètes:

g1<-qplot(color, price / carat, data = diamonds, geom = "boxplot")
g2<-qplot(color, price / carat, data = diamonds, geom = "jitter")
grid.arrange(g1,g2,ncol=2,nrow=1)

Jouer avec la transparence

Pour apprécier la distribution, on peut aussi faire varier la transparence. Par défaut, il n’y a pas de transparence. Le paramètre alpha vaut 1. En le fixant à 1/5 (20%), il ’y aura aucune transparence si on empile 5 points. A 1/50, il faudra 50 points empilés et 200 pour 1/200.

g1<-qplot(color, price / carat, data = diamonds, geom = "jitter",
alpha = I(1 / 5))
g2<-qplot(color, price / carat, data = diamonds, geom = "jitter",
alpha = I(1 / 50))
g3<-qplot(color, price / carat, data = diamonds, geom = "jitter",
alpha = I(1 / 200))
grid.arrange(g1,g2,g3,ncol=3,nrow=1)

Histogramme et graphe de densité

Les histogrammes et graphe de densité sont utiles pour visualiser la distribution d’une variable.

g1<-qplot(carat, data = diamonds, geom = "histogram")
g2<-qplot(carat, data = diamonds, geom = "density")
grid.arrange(g1,g2,ncol=2,nrow=1)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Fixer la taille des intervalles d’un histogramme avec binwidth

g1<-qplot(carat, data = diamonds, geom = "histogram", binwidth = 1,
xlim = c(0,3))
g2<-qplot(carat, data = diamonds, geom = "histogram", binwidth = 0.1,
xlim = c(0,3))
g3<-qplot(carat, data = diamonds, geom = "histogram", binwidth = 0.01,
xlim = c(0,3))

grid.arrange(g1,g2,g3,ncol=3,nrow=1)
## Warning: Removed 32 rows containing non-finite values (stat_bin).
## Warning: Removed 2 rows containing missing values (geom_bar).
## Warning: Removed 32 rows containing non-finite values (stat_bin).
## Warning: Removed 2 rows containing missing values (geom_bar).
## Warning: Removed 32 rows containing non-finite values (stat_bin).
## Warning: Removed 2 rows containing missing values (geom_bar).

Comparer la distribution de sous-groupe

g1<-qplot(carat, data = diamonds, geom = "density", colour = color)
g2<-qplot(carat, data = diamonds, geom = "histogram", fill = color)

grid.arrange(g1,g2,ncol=2,nrow=1)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Series temporelles

g1<-qplot(date, unemploy / pop, data = economics, geom = "line")
g2<-qplot(date, uempmed, data = economics, geom = "line")

grid.arrange(g1,g2,ncol=2,nrow=1)

Graphes multiples: faceting

g1<-qplot(carat, data = diamonds, facets = color ~ .,
geom = "histogram", binwidth = 0.1, xlim = c(0, 3))
g2<-qplot(carat, ..density.., data = diamonds, facets = color ~ .,
geom = "histogram", binwidth = 0.1, xlim = c(0, 3))

grid.arrange(g1,g2,ncol=2,nrow=1)
## Warning: Removed 32 rows containing non-finite values (stat_bin).
## Warning: Removed 14 rows containing missing values (geom_bar).
## Warning: Removed 32 rows containing non-finite values (stat_bin).
## Warning: Removed 14 rows containing missing values (geom_bar).

Sources:

https://www.r-graph-gallery.com http://larmarange.github.io/analyse-R/intro-ggplot2.html http://r4ds.had.co.nz/graphics-for-communication.html http://www.ggplot2-exts.org http://ggplot2.tidyverse.org/index.html http://perso.ens-lyon.fr/lise.vaudor/Supports_formation/Graphiques_ggplot2.html https://www.tutorialgateway.org/lattice-scatter-plot-in-r/ http://ggplot2.org/book/qplot.pdf https://github.com/hadley/ggplot2-book/blob/master/ggplot.rmd http://egallic.fr/Enseignement/R/Slides/graphiques.html